// 将对象的所有属性递归变成可选。
export type DeepPartial<T> = {
    [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};

// 将 U 合并进 T，若有重复字段则用 U 的值覆盖
export type Merge<T, U> = Omit<T, keyof U> & U;


// 获取对象值类型的联合类型
export type ValueOf<T> = T[keyof T];

// 将所有属性从 readonly 变成可变
export type Mutable<T> = {
    -readonly [P in keyof T]: T[P];
};

// 获取对象中哪些是可选字段
export type OptionalKeys<T> = {
    [K in keyof T]-?: {} extends Pick<T, K> ? K : never;
}[keyof T];

// 获取对象中哪些是必填字段
export type RequiredKeys<T> = {
    [K in keyof T]-?: {} extends Pick<T, K> ? never : K;
}[keyof T];

// 把函数的返回类型变成 Promise 包裹
export type Promisify<T> = T extends (...args: infer A) => infer R
    ? (...args: A) => Promise<R>
    : never;

// 将联合类型转为交叉类型
export type UnionToIntersection<U> = 
    (U extends any ? (x: U) => any : never) extends
    (x: infer R) => any ? R : never;

// 判断是否是 never 类型
export type IsNever<T> = [T] extends [never] ? true : false;

// 强类型比较：T 必须完全匹配 Shape，不能有多余的字段
export type Exact<T, Shape> = T extends Shape
    ? Exclude<keyof T, keyof Shape> extends never
    ? T
    : never
    : never;

// 条件类型工具，如果两个类型完全相等，则返回 A，否则返回 B
export type IfEquals<X, Y, A, B> = 
    (<T>() => T extends X ? 1 : 2) extends 
    (<T>() => T extends Y ? 1 : 2) ? A : B;

// 展开类型（用于调试或提高类型显示清晰度）
export type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;

export type ToastIcon = "success" | "error" | "loading" | "none";

export type PopupMessageType = "success" | "warn" | "error" | "info";